ШАГ 9 - Другие типы соединений

Для того, чтобы понять необходимость оператора внешнего соединения (outer join) попробуем выдать список сотрудников отделов 30 и 40 с указанием названий отделов. Необходимо выполнить соединение таблиц DEPT и EMP:

SELECT E.ENAME, D.DEPTNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO AND D.DEPTNO IN (30,40);

Однако при просмотре результата обнаруживаем, что отдел 40 вообще отсутствует и причина этого понятна. В отделе 40 пока нет ни одного сотрудника и потому значению 40 столбца D.DEPTNO не соответствует ни одного значения столбца E.DEPTNO, значит ни одна строка таблицы EMP не будет соединена со строкой описывающей отдел 40 в таблице DEPT. Просматривая выданный результат пользователь будет вынужден подумать о том почему отдел 40 проигнорирован (нет его, неверно составлен запрос, что то еще?), тем более, что при тестировании с другим заполнением таблиц будет получен верный результат).

Внешнее соединение

Обозначается как (+) проставляется на той стороне соединяющего условия (к той таблице), где могут отсутствовать данные. (+) создает пустую строку (строки) и соединяет ее (их) с каждой строкой, не имеющей соответствующих значений.
Изменяем условие WHERE на WHERE E.DEPTNO(+) =D.DEPTNO и получаем верный результат:

ENAME  DEPTNO  DNAME
-----  ------  ---------
ALLEN      30  SALES
..... 
WARD       30  SALES
           40  OPERATORS

Ограничения на применение внешнего соединения:

Замечание. Если строки не имеющие пары могут иметься в двух таблицах сразу, используйте объединение UNION (см. ниже).

Соединение таблицы с собой

Если таблица содержит иерархическую структуру, то могут использоваться ее соединения с собой. Чтобы выполнить такое соединение, вводят два разных псевдонима во фразе FROM, например, FROM EMP E, EMP EE, а затем используют их как префиксы в обозначениях столбцов.

Операторы над множествами

Позволяют объединять операторы SELЕСТ, образующие таблицы с одинаковым количеством столбцов, причем соответствующие столбцы должны иметь одинаковый тип.
Именуются столбцы результата по именам столбцов полученных первым SELЕСТ.
Повторяющиеся строки в результате отсутствуют за исключением UNION ALL . Квалификатор DISTINCT не допускается.
Используют:
UNION     -- объединение;
UNION ALL     -- объединение, но допускается повтор строк;
INTERSECT     -- пересечение (выбирает строки, общие для таблиц-операндов;
MINUS     -- теоретико-множественная разность (строки первого операнда, которых нет во втором операнде);
Если перечисленными операторами объединяется несколько SELЕСТ, то порядок выполнения сверху вниз. Для изменения порядка выполнения используются скобки.
Сортировка ORDER BY может применяться только один раз, относится к итоговой таблице результатов и стоит в сложном запросе на последнем месте.
Ссылка на столбцы в ORDER BY производится только по порядковым номерам.

Упражнения

1. Напечатаем список сотрудников, содержащий их имена, номера, а также имена и номера их руководителей. Учтите, что в таблице EMP содержатся сведения об иерархической структуре организации. Достигается это тем, что для каждого сотрудника указывается его менеджер (столбец MGR).

SELЕСТ EMPS.EMPNO, EMPS.ENAME, MGRS.EMPNO MGRNO, MGRS. ENAME МGR_NAME FRОМ ЕМР EMPS, EMP MGRS WHERE EMPS.MGR = MGRS.ЕМРNО;

В окне SQL*Plus Вы должны получить следующие значения:

EMPNO  ENAME   MGRNO  MGRNАМЕ
-----  ------  -----  -------
7788   SCOTT   7566   JONES
7902   FORD    7566   JONES
7499   ALLEN   7689   BLAKE
7521   WARD    7689   BLAKE 
7654   MARTIN  7689   BLAKE 
7844   TURNER  7689   BLAKE 
7900   JAMES   7689   BLAKE 
....   .....   ....   .....

2. Найдем должность, на которую были приняты сотрудники в первой половине 1983 года и в тот же период 1984 года.

SELЕСТ JOB FRОМ ЕМР WHERE HIREDATE BETWEEN ’01-JAN-83’ AND ’30-JUN-83’
INTERSECT SELЕСТ JOB FRОМ ЕМР WHERE HIREDATE BETWEEN ’01-JAN-84’ AND ’30-JUN-84’

В окне SQL*Plus Вы должны получить следующие значения:

JOB
--------
CLERK
Автор: Michael Nemtsev aka 'LaFlour'

Hosted by uCoz